package com.sojson.project.sys.config.controller.param.verify;

import com.sojson.enums.core.EConfigType;
import com.sojson.enums.core.EConfigTypeNum;
import com.sojson.project.sys.config.entity.po.Config;
import com.sojson.result.Result;
import com.sojson.util.ExpUtil;
import com.sojson.util.StringUtil;

/**
 * 配置表参数验证
 * 
 * @author liu
 * @date 2021-03-16
 */
public class ConfigParamVerify {

    /**
     * 单条插入
     * 
     * @param dto
     * @return
     */
    public static Result<Boolean> save(Config dto) {
        if (StringUtil.isBlank(dto.getName())) {
            return Result.fail("配置名不能为空！");
        }
        if (StringUtil.isBlank(dto.getKey())) {
            return Result.fail("别名不能为空！");
        }
        String val = dto.getVal();
        if (StringUtil.isBlank(val)) {
            return Result.fail("配置值不能为空！");
        }
        Integer type = dto.getType();
        if (StringUtil.isBlank(type)) {
            return Result.fail("类型不能为空！");
        }
        if (type == EConfigType.INT.getCode() || type == EConfigType.DOUBLE.getCode()
            || type == EConfigType.TOTAL.getCode()) {
            double parseVal = 0;
            if (type == EConfigType.INT.getCode()) {
                parseVal = Integer.parseInt(val);
            } else if (type == EConfigType.DOUBLE.getCode()) {
                parseVal = Double.parseDouble(val);
            } else if (type == EConfigType.TOTAL.getCode()) {
                parseVal = Double.parseDouble(val);
                int lastIndexOf = val.lastIndexOf(".");
                if (lastIndexOf > 0) {
                    if (val.substring(lastIndexOf).length() > 3) {
                        ExpUtil.throwEx("金额小数位最多只允许两位");
                    }
                }
            }
            Integer typeNum = dto.getTypeNum();
            if (StringUtil.isBlank(typeNum)) {
                return Result.fail("数字类型不能为空！");
            }
            if (typeNum != EConfigTypeNum.UNLIMITED.getCode()) {
                if (typeNum == EConfigTypeNum.PLUS.getCode() && parseVal < 0) {
                    return Result.fail("不能为负数！");
                } else if (typeNum == EConfigTypeNum.MINUS.getCode() && parseVal > 0) {
                    return Result.fail("不能为正数！");
                }
                Boolean typeNumIsZero = dto.getTypeNumIsZero();
                if (StringUtil.isBlankObject(typeNumIsZero)) {
                    return Result.fail("是否允许为0不能为空！");
                }
                if (!typeNumIsZero && parseVal == 0) {
                    return Result.fail("不允许为0！");
                }
            }
        } else if (type == EConfigType.BOOLEAN.getCode()) {
            Boolean.parseBoolean(val);
        }

        return Result.success();
    }

    /**
     * 通过ID更新
     * 
     * @param dto
     * @return
     */
    public static Result<Boolean> updateById(Config dto) {
        if (StringUtil.isBlank(dto.getId())) {
            return Result.fail("ID不能为空！");
        }

        return save(dto);
    }

}